package com.qf.xiaom.service.impl;

import com.qf.xiaom.dao.UserDao;
import com.qf.xiaom.dao.impl.UserDaoImpl;
import com.qf.xiaom.pojo.TbUser;
import com.qf.xiaom.service.UserService;
import com.qf.xiaom.utils.EmailUtils;
import com.qf.xiaom.utils.MD5Utils;

import java.util.UUID;
import java.util.concurrent.CompletableFuture;

public class UserServiceImpl implements UserService {
    private UserDao userDao=new UserDaoImpl();

    @Override
    public int addUser(TbUser user) {
        //设置数据
        //修改密码为MD5
        user.setPassword(MD5Utils.md5(user.getPassword()));
        //设置code，这个code是一个随机的内容，并不是真正的随机数，这个code的目的是和用户绑定，激活的时候通过code来区分谁在激活
        //激活的时候需要传递code过来，我们一般发送邮件的时候会将code带过去，用户点击链接的时候会带着code回来
        user.setCode(UUID.randomUUID().toString().replace("-",""));
        //添加到数据库
        int result=userDao.addUser(user);
        //发送邮件
        //发送邮件如果失败了，注册要回滚吗？不需要，现在我们有一个后续的操作，这个操作属于核心操作吗
        //不属于核心操作，并且这个操作的成功失败不影响核心操作
        //结合上面的分析，我们发送邮件可以设置为异步操作
        System.out.println(Thread.currentThread().getName());
        CompletableFuture.runAsync(()->{
            //把我们要执行的操作歇过来
            EmailUtils.sendEmail(user);
        });
        return result;
    }

    @Override
    public TbUser login(String username, String password) {
        //按照用户名查询
        TbUser user=userDao.findByUserName(username);
        if (user!=null){
            //获取查询到的密码
            String userPassword=user.getPassword();
            //将输入的密码转成md5
            String md5=MD5Utils.md5(password);
            if (userPassword.equalsIgnoreCase(md5)){
                //如果密码一致就返回
                return user;
            }
        }
        return null;
    }

    @Override
    public int updateLoginTime(Long userId) {
        //updateLoginTime更新登录时间
        return userDao.updateLoginTime(userId);
    }
}
